package main

import (
	"bufio"
	"bytes"
	"fmt"
	"io"
	"strings"
)

func main11() {
	input := "go to study go language"
	// 利用字符串变量input创建一个Reader对象，并作为创建bufio.Scanner对象时的参数
	scanner := bufio.NewScanner(strings.NewReader(input))
	// 为了演示效果，创建3字节大小的缓冲区
	buf := make([]byte, 3)
	// 将其最大大小设置为2，小于缓冲区的初始大小，从而防止缓冲区扩张
	scanner.Buffer(buf, 2)

	// 自定义字符串分割后的分析函数
	split := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
		// 如果找到要的字符串"go"，则将位置向前移动1，并将token置为"found"
		// 注意此处的"found"与被分析的字符串没有任何关系
		if bytes.Equal(data[:2], []byte{'g', 'o'}) {
			return 1, []byte("found"), nil
		}
		// 如果到达分析数据的结尾，即数据源中没有其他数据可供分析，则返回错误
		if atEOF {
			return 0, nil, io.EOF
		}

		// 如果未分析完所有数据，则位置前移1
		return 1, nil, nil
	}

	// 设置split()函数到scanner的split属性中
	scanner.Split(split)
	// 循环执行扫描分析，并打印分析结果，在这里，为字符串"found"
	for scanner.Scan() {
		fmt.Printf("%s\n", scanner.Text())
	}
}
